home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tiger Disk 6
/
Tiger_Disk_006_19xx_Tiger-Crew-Disk_de_Side_B.d64
/
8 mk
(
.txt
)
< prev
next >
Wrap
Commodore BASIC
|
2023-02-26
|
7KB
|
165 lines
8 clr
10 u$="[197][197][197][197][197][197][197][197][197][197]":o$="[164][164][164][164][164][164][164][164][164]"
100 fori=830to900:readx:pokei,x:next
110 data 169,32,162,0,157,0,128,232,224,40,208,248,96,0,0,0,0,0,0
114 data 0,169,32,162,39,157,0,128,202,16,250,96,0,0,0,0,0,0,0,0,0
118 data 169,32,162,40,157,255,127,202,208,250,96,0,0,0,0,0,0,0,0,0
119 data 169,42,162,40,157,255,127,202,208,250,96
200 print"[147][164][164]";o$;o$;o$;o$:print"syntax-lehrgang 'maschinensprache' (8)
210 [153]o$;o$;"toto":[153]"1.3.3. sprungbefehle
220 print"bei sprungbefehlen unterscheidet man
230 [153]"bedingte und unbedingte sprungbefehle.
240 print"a) bedingte sprungbefehle sind solche
250 [153]"sprungbefehle, die nur ausgefuehrt wer-
260 print"den, wenn eine bestimmte bedingung er-
270 [153]"fuellt ist (basic: if .. then goto ..).
280 print"b) unbedingte spruenge werden immer
290 [153]"ausgefuehrt (basic: goto 10).
310 i=1:gosub5000:ifflthen200
400 print"[147]a) die bedingten sprungbefehle":printu$;u$;u$
410 print"im prozessor-statusregister (sr) geben
420 [153]"vier der flags auskuenfte ueber das er-
430 print"gebnis der letzten rechenoperation: die
440 [153]"flags n/z/c/v (negativ/zero/carry/over-
450 print"flow).fuer jedes dieser vier flags gibt
460 [153]"es zwei abfragen in form von bedingten
470 print"sprungbefehlen: entweder sprung bei
480 [153]"flag = 0 oder aber sprung bei flag = 1.
500 print"es gibt daher acht verschiedene sprung-":print"befehle.
520 i[178]2:[141]5000:[139]fl[167]200
600 [153]"loadtototo":[153]"bmiwait branch if minus (if n-flag =1)"
605 [153]"tototo val valval"
610 [153]"bplwait branch if plus (if n-flag =0)
615 print" [197] [197][197]
620 [153]"'branch' heisst 'verzweigen'. d.h., das
630 print"programm verzweigt sich an der stelle,
640 [153]"wo dieser befehl steht. ist die abfra-
650 print"gebedingung erfuellt,so wird der sprung
660 [153]"ausgefuehrt,sonst nicht. in diesem fall
670 print"wird das programm mit dem befehl fort-
675 [153]"gesetzt, der dem sprungbefehl folgt. im
680 print"gegensatz zu basic ist der sprung aber
690 [153]"relativ adressiert und nicht absolut.
720 i=3:gosub5000:ifflthen400
800 print"[147]wir erinnern uns: das dem sprungbefehl
810 [153]"folgende byte gibt an, wieviele bytes
820 print"im programm uebersprungen werden sollen":print"es bedeuten:
850 [153]"bmi $01 sprung nach vorne um 1 byte
860 print"bmi $00 sprung um 0 byte (also effektiv
870 [153]" gar kein sprung!)
880 print"bmi $ff sprung nach hinten um 1 byte":print"etc.
930 i[178]4:[141]5000:[139]fl[167]600
1000 [153]"loadsie brauchen sich nicht zu merken, wel-
1010 print"chen wert das n-flag haben muss, damit
1020 [153]"der sprung erfolgt.merken sie sich nur:
1030 print"bei bmi wird bei mi[146][145][157][157][164][164]nus gesprungen, bei
1040 [153]"bpl bei plwaitoncmdcmdtotous. einfach, nicht wahr ?
1050 print"zu beachten ist hierbei, dass die zahl
1080 [153]"$00 eine positive zahl ist.
1130 i=5:gosub5000:ifflthen800
1200 print"[147]meist geht bmi und bpl eine vergleichs-
1210 [153]"operation wie z.b. cmp voraus. der pro-
1220 print"zessor vergleicht (= subtrahiert) zwei
1230 [153]"datenworte. entsprechend dem ergebnis
1240 print"setzt er das n-flag auf 0 oder 1. mit
1250 [153]"bmi/bpl fragt man ab, ob die subtrak-
1260 print"tion ein positives oder negatives er-
1270 [153]"gebnis hatte, ob also das erste oder
1280 print"das zweite datenwort groesser war.
1290 [153]"vergleichen sie das mit dem basicbefehl
1300 print"'if a>b then goto ...' !!
1320 i[178]6:[141]5000:[139]fl[167]1000
1400 [153]"loadtototo":[153]"beqwait branch if equal zero (if z-flag=1)
1405 print"[164][164][164] [197] [197][197]
1410 [153]"bnewait branch if not equal zero (if z = 0)
1415 print" [197] [197] [197]
1420 [153]"bei beq (bne) erfolgt der sprung, wenn
1430 print"die letzte operation das ergebnis null
1440 [153]"(ungleich null) hatte.
1450 print"besonders leicht zu merken ist die kom-
1455 [153]"bination mit vorangehendem cmp:
1510 i=7:gosub5000:ifflthen1200
1600 print"[147]cmp # $1a":print"beq $0f"
1620 print"bedeutet woertlich vorgelesen: compare
1630 [153]"accumulator with byte $1a and if equal
1640 print"branch $0f bytes. oder auf deutsch:
1650 [153]"vergleiche das byte im ac mit dem byte
1660 print"$1a und wenn sie gleich sind, springe
1670 [153]"$0f (=15) bytes nach vorne.
1680 print"die abkuerzungen der assemblersprache
1690 [153]"sind hier besonders einpraegsam.
1710 i=8:gosub5000:ifflthen1400
1800 print"[147][164][164][164] [164][164][164]":print"bcc[146]/bcs[146] branch if carry-flag clear/set
1810 [153]"tototo tototo":[153]"bvcwait/bvswait '' overflow-flag ''
1820 print"der erste buchstabe (b) bedeutet wieder
1830 [153]"'branch', der zweite (c/v) bezeichnet
1840 print"das getestete flag und der dritte (c/s)
1850 [153]"bedeutet 'clear' bzw. 'set'. oder auf
1855 print"deutsch: clear = rueckgesetzt (0) und
1860 [153]"set = gesetzt (1).
1870 print"die befehle bvc/bvs werden ihnen nicht
1880 [153]"oft begegnen, beq/bne jedoch sehr oft.
1910 i=9:gosub5000:ifflthen1600
2000 print"[147]beispiele:":printu$
2005 print"zu jedem problem gibt es meist mehrere
2010 [153]"loesungsmoeglichkeiten, die sich durch
2020 print"details unterscheiden. in den folgenden
2030 [153]"beispielen zeigen wir ihnen zum selben
2040 print"problem verschiedene loesungen mit hin-
2050 [153]"weisen,wo die unterschiede liegen. ver-
2055 print"suchen sie diese zu verstehen !":print"hier das problem:
2070 [153]"loeschen der ersten bildschirmzeile von
2080 print"dez. 32768-32807 bzw. hex $8000-$8027.
2110 i[178]10:[141]5000:[139]fl[167]1800
2200 [153]"load1. moeglichkeit:
2220 a$="lda #$20 lade ac mit zeichen space":printa$
2230 print"ldx #$00 zaehler auf null setzen
2240 [153]"sta $8000,x ac nach $8000+xr
2250 print"inx zaehler um 1 erhoehen
2260 [153]"cpx #$28 ende erreicht?
2270 print"bne $f8 schleife
2280 [153]"zaehler zaehlt von $00 bis $28. schlei-
2290 print"fenabbruch mit xr=$28. letzte speicher-
2300 [153]"adresse: $8027. abbruch bei z-flag = 1.
2310 i=11:gosub5000:ifflthen2000
2400 print"[147]2. moeglichkeit:":printa$
2420 print"ldx #$27 zaehler auf $27 setzen
2430 [153]"sta $8000,x ac nach $8000+xr
2440 print"dex zaehler um 1 erniedrigen
2460 [153]"bpl $fa schleife,bis xr minus wird
2470 print"zaehler zaehlt von $27 bis $ff. schlei-
2480 [153]"fenabbruch mit xr=$ff. letzte speicher-
2490 print"adresse: $8000. abbruch bei n-flag = 1.
2500 [153]"zaehlweise: rueckwaerts.
2510 i=12:gosub5000:ifflthen2200
2600 print"[147]3. moeglichkeit:":printa$
2620 print"ldx #$28 zaehler auf $28 setzen
2630 [153]"sta $7fff,x ac nach $7fff+xr
2640 print"dex zaehler um 1 erniedrigen
2660 [153]"bne $fa schleife,bis xr = $00
2670 print"zaehler zaehlt von $28 bis $00. schlei-
2680 [153]"fenabbruch mit xr=$00. letzte speicher-
2690 print"adresse: $8000. abbruch bei z-flag = 1.
2700 [153]"zaehlweise: rueckwaerts.
2710 i=13:gosub5000:ifflthen2400
2800 print"[147]aufgaben:":printu$
2805 print"1. loeschen der ersten 5 bildschirmzei-":print" len.
2820 [153]"2. erste zeile mit '*' vollschreiben.
2830 print"3. im 3. beispiel hat das xr beim ab-
2840 [153]" bruch der schleife den wert $00. der
2850 print" speicher $7fff + $00 wird aber nicht
2860 [153]" mehr angesprochen. warum ?
2870 print"die beispiele 1-3 finden sie ab 830,850
2880 [153]"und 870 im ram, aufgabe 2 ab 890.
2910 print" - seite 14 - <+> [145][164][164][164][164][157][157][157][157]ende[146] <-> von vorne";
3060 gosub5020:onflgoto0
3070 print"[147]":fori=0to40:sys890:forw=0to10:nextw:sys830:forw=0to20:nextw:nexti
3080 end:run
5000 rem umblaettern
5010 print" - seite";i;"- <+> weiter <-> zurueck";
5020 fori=0to11:getx$:next
5030 getx$:ifx$=""then5030
5040 ifx$="+"thenfl=0:return
5050 ifx$="-"thenfl=1:return
5060 goto5030